/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Monitores;

import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Monitor que controla el acceso al Array con los valores a descargar.
 * descargados.
 * @author felipe
 */
public class MonitorValoresADescargar {

    private ArrayList<String> listaValores;
    private final Lock lock;
    private final Condition noHayValores;

    public MonitorValoresADescargar() {
        this.listaValores = new ArrayList<>();
        this.lock = new ReentrantLock(true);
        this.noHayValores = lock.newCondition();
    }

    /**
     * Introduce un valor para descargar.
     *
     * @param valor
     */
    public void putValor(String valor) {
        lock.lock();
        try {
            listaValores.add(valor);
            noHayValores.signal();
        } finally {
            lock.unlock();
        }
    }

    /**
     * Devuelve un valor para descargar.
     *
     * @return
     */
    public String getValor() {
        lock.lock();
        String valor = null;
        try {
            if (!listaValores.isEmpty()) {
                valor = listaValores.get(0);
                listaValores.remove(valor);
            }
        } finally {
            lock.unlock();
            return valor;
        }
    }
}
